package scheduler

import (
	"fmt"
	"net"
	"x1aCron/internal/core"
	"x1aCron/internal/global"
	"x1aCron/internal/utils"
)

// 当前只支持单个定时任务核心
type Scheduler struct {
	cron *core.Cron
}

func NewScheduler() *Scheduler {
	return &Scheduler{
		cron: core.NewCron(),
	}
}

func (s *Scheduler) Start() {
	s.cron.Start()
}

func (s *Scheduler) Stop() {
	s.cron.Stop()
}

func (s *Scheduler) AddTask(task *core.Task) {
	s.cron.AddTask(task)
}

func (s *Scheduler) GetTasks() []*core.Task {
	return s.cron.GetTasks()
}

func (s *Scheduler) RemoveTaskByID(id int64) {
	s.cron.RemoveTaskByID(id)
}

func (s *Scheduler) Run(done chan struct{}) {
	// 启动调度器
	s.Start()
	utils.NewUnixSocket(global.SocketPath).Start(func(r utils.Requests, c net.Conn) {
		s.handleRequest(c, r)
	}, done)
}

func (s *Scheduler) handleRequest(conn net.Conn, req utils.Requests) {
	for _, req := range req.Requests {
		// switch req.TaskType {
		// case utils.AddTask:
		// 	addData := utils.AddTaskData{}
		// 	if err := json.Unmarshal(req.Data, &addData); err != nil {
		// 		utils.SendError(conn, "invalid add task data format")
		// 		return
		// 	}
		// 	task, err := addData.ToTask()
		// 	if err != nil {
		// 		utils.SendError(conn, err.Error())
		// 		return
		// 	}
		// 	s.AddTask(task)
		// 	utils.SendSuccess(conn, "task "+fmt.Sprintf("%d", task.ID)+" added successfully")
		// case utils.List:
		// case utils.Remove:
		// case utils.Stop:

		// case utils.Status:
		// default:
		// 	utils.SendError(conn, "unsupported task type: "+req.TaskType)
		// 	return
		// }
		switch req.TaskType {
		case utils.AddTask:
			fmt.Println("Received AddTask request")
			utils.SendSuccess(conn, "AddTask request received")
		case utils.List:
			fmt.Println("Received List request")
			utils.SendSuccess(conn, "List request received")
		case utils.Remove:
			fmt.Println("Received Remove request")
			utils.SendSuccess(conn, "Remove request received")
		case utils.Stop:
			fmt.Println("Received Stop request")
			utils.SendSuccess(conn, "Stop request received")
		case utils.Status:
			fmt.Println("Received Status request")
			utils.SendSuccess(conn, "Status request received")
		default:
			utils.SendError(conn, "unsupported task type: "+req.TaskType)
			return
		}
	}
}
